home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / winsock / ircii2-6.zip / SRC\IRCII-2.6\SOURCE\NOTICE.C < prev    next >
C/C++ Source or Header  |  1994-12-31  |  9KB  |  357 lines

  1. /*
  2.  * notice.c: special stuff for parsing NOTICEs
  3.  *
  4.  * Written By Michael Sandrof
  5.  *
  6.  * Copyright(c) 1991
  7.  *
  8.  * See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT 
  9.  */
  10.  
  11. #ifndef lint
  12. static    char    rcsid[] = "@(#)$Id: notice.c,v 1.18 1994/07/02 02:32:13 mrg Stab $";
  13. #endif
  14.  
  15. #include "irc.h"
  16.  
  17. #include "whois.h"
  18. #include "ctcp.h"
  19. #include "window.h"
  20. #include "lastlog.h"
  21. #include "flood.h"
  22. #include "vars.h"
  23. #include "ircaux.h"
  24. #include "hook.h"
  25. #include "ignore.h"
  26. #include "server.h"
  27. #include "funny.h"
  28. #include "output.h"
  29. #include "names.h"
  30. #include "parse.h"
  31. #include "notify.h"
  32.  
  33. extern    char    *FromUserHost;
  34.  
  35. extern    void    got_initial_version();
  36. extern    int    IngoreCombo();
  37.  
  38. /*
  39.  * parse_note: handles the parsing of irc note messages which are sent as
  40.  * NOTICES.  The notice() function determines which notices are note messages
  41.  * and send that info to parse_note() 
  42.  */
  43. static    void    parse_note(server, line)
  44. char    *server;
  45. char    *line;
  46. {
  47.     char    *date,
  48.         *nick,
  49.         *flags,
  50.         *high,
  51.         *name,
  52.         *message;
  53.     int    ign1,
  54.         ign2,
  55.         level;
  56.     time_t    time;
  57.  
  58.     flags = next_arg(line, &date);    /* what to do with these flags */
  59.     nick = next_arg(date, &date);
  60.     name = next_arg(date, &date);
  61.     if ((message = index(date, '*')) != NULL)
  62.         *message = (char) 0;
  63.     if (((ign1 = is_ignored(nick, IGNORE_NOTES)) == IGNORED) ||
  64.             ((ign2 = is_ignored(name, IGNORE_NOTES)) == IGNORED))
  65.         return;
  66.     if ((ign1 == HIGHLIGHTED) || (ign2 == HIGHLIGHTED))
  67.         high = &highlight_char;
  68.     else
  69.         high = empty_string;
  70.     time = atol(date);
  71.     date = ctime(&time);
  72.     date[24] = (char) 0;
  73.     level = set_lastlog_msg_level(LOG_NOTES);
  74.     if (do_hook(NOTE_LIST, "%s %s %s %s %s %s", nick, name, flags, date,
  75.         server, message + 2))
  76.     {
  77.         put_it("Note from %s (%s) %s", nick, name, flags);
  78.         put_it("It was queued %s from server %s", date, server);
  79.         put_it("%s[%s]%s %s", high, nick, high, message + 2);
  80.     }
  81.     if (beep_on_level & LOG_NOTES)
  82.         beep_em(1);
  83.     set_lastlog_msg_level(level);
  84. }
  85.  
  86. static    void    parse_server_notice(from, line)
  87. char    *from,
  88.     *line;
  89. {
  90.     char    server[81],
  91.         version[21];
  92.     int    user_cnt,
  93.         server_cnt,
  94.         lastlog_level;
  95.     int    flag;
  96.  
  97.     if (!from || !*from)
  98.         from = server_list[from_server].itsname ?
  99.             server_list[from_server].itsname :
  100.             server_list[from_server].name;
  101.     if (get_int_var(SUPPRESS_SERVER_MOTD_VAR) &&
  102.         get_server_motd(from_server))
  103.     {
  104.         if (strncmp("*** Message-of-today", line, 20) == 0)
  105.         {
  106.             set_server_motd(from_server, 0);
  107.             return;
  108.         }
  109.         if (strncmp("MOTD ", line, 5) == 0)
  110.         {
  111.             set_server_motd(from_server, 1);
  112.             return;
  113.         }
  114.         if (strcmp("* End of /MOTD command.", line) == 0)
  115.         {
  116.             set_server_motd(from_server, 0);
  117.             return;
  118.         }
  119.     }
  120.     if (!strncmp(line, "*** Notice --", 13))
  121.     {
  122.         message_from((char *) 0, LOG_OPNOTE);
  123.         lastlog_level = set_lastlog_msg_level(LOG_OPNOTE);
  124.     }
  125.     else
  126.     {
  127.         message_from((char *) 0, LOG_SNOTE);
  128.         lastlog_level = set_lastlog_msg_level(LOG_SNOTE);
  129.     }
  130.     if (get_server_version(from_server) >= Server2_7 && 
  131.         *line != '*'  && *line != '#' && strncmp(line, "MOTD ", 4))
  132.         flag = 1;
  133.     else
  134.         flag = 0;
  135.     if (do_hook(SERVER_NOTICE_LIST, flag ? "%s *** %s"
  136.                          : "%s %s", from, line))
  137.         put_it(flag ? "*** %s" : "%s", line);
  138.     if ((from_server == primary_server) &&
  139.             ((sscanf(line, "*** There are %d users on %d servers",
  140.             &user_cnt, &server_cnt) == 2) ||
  141.             (sscanf(line, "There are %d users on %d servers",
  142.             &user_cnt, &server_cnt) == 2)))
  143.     {
  144.         if ((server_cnt < get_int_var(MINIMUM_SERVERS_VAR)) ||
  145.                 (user_cnt < get_int_var(MINIMUM_USERS_VAR)))
  146.         {
  147.             say("Trying better populated server...");
  148.             get_connected(from_server + 1);
  149.         }
  150.     }
  151. #ifdef BROKEN_SCANF
  152.     else if (!strncmp(line, "*** Your host is ", 17))
  153. #else
  154.     else if ((sscanf(line, "*** Your host is %80s running version %20s",
  155.             server, version) == 2))
  156. #endif /* BROKEN_SCANF */
  157.     {
  158.         if (get_server_version(from_server) < Server2_8)
  159.             got_initial_version(line);
  160.     }
  161.     if (lastlog_level)
  162.     {
  163.         set_lastlog_msg_level(lastlog_level);
  164.         message_from((char *) 0, lastlog_level);
  165.     }
  166. }
  167.  
  168. void     parse_notice(from, Args)
  169. char     *from;
  170. char     **Args;
  171. {
  172.     int    level,
  173.         type;
  174.     char    *to;
  175.     int    no_flooding;
  176.     int    flag;
  177.     char    *high,
  178.         not_from_server = 1;
  179.     char    *line;
  180.  
  181.     PasteArgs(Args, 1);
  182.     to = Args[0];
  183.     line = Args[1];
  184.     if (!to || !line)
  185.         return;
  186.     if (*to)
  187.     {
  188.         if (is_channel(to))
  189.         {
  190.             message_from(to, LOG_NOTICE);
  191.             type = PUBLIC_NOTICE_LIST;
  192.         }
  193.         else
  194.         {
  195.             message_from(from, LOG_NOTICE);
  196.             type = NOTICE_LIST;
  197.         }
  198.         if (from && *from && strcmp(get_server_itsname(from_server), from))
  199.         {
  200.             flag = double_ignore(from, FromUserHost,IGNORE_NOTICES);
  201.             if (flag != IGNORED)
  202.             {
  203.                 if (flag == HIGHLIGHTED)
  204.                     high = &highlight_char;
  205.                 else
  206.                     high = empty_string;
  207.                 if (index(from, '.'))
  208.                 {
  209.         /*
  210.          * only dots in servernames, right ?
  211.          *
  212.          * But a server name doesn't nessicarily have to have
  213.          * a 'dot' in it..  - phone, jan 1993.
  214.          */
  215.                     not_from_server = 0;
  216.                     if (strncmp(line, "*/", 2) == 0)
  217.                     {
  218.                         parse_note(from, line + 1);
  219.                         return;
  220.                     }
  221.                 }
  222.                 if (not_from_server && (flag != DONT_IGNORE) && !FromUserHost &&
  223.                             (ignore_usernames & IGNORE_NOTICES))
  224.                     add_to_whois_queue(from, whois_ignore_notices, "%s", line);
  225.                 else
  226.                 {
  227.                     line = do_notice_ctcp(from, to, line);
  228.                     if (*line == (char) 0)
  229.                         return;
  230.                     level = set_lastlog_msg_level(LOG_NOTICE);
  231.                     no_flooding = check_flooding(from, NOTICE_FLOOD, line);
  232.  
  233.                     if (sed == 1 && !do_hook(ENCRYPTED_NOTICE_LIST, "%s %s %s", from, to, line))
  234.                         sed = 0;
  235.                     else
  236.                     {
  237.                         if (type == NOTICE_LIST && no_flooding)
  238.                         {
  239.                             if (do_hook(type, "%s %s", from, line))
  240.                                 put_it("%s-%s-%s %s", high, from, high, line);
  241.                         }
  242.                         else
  243.                         {
  244.                             if (do_hook(type, "%s %s %s", from, to, line))
  245.                                 put_it("%s-%s:%s-%s %s", high, from, to, high, line);
  246.                         }
  247.                         if (beep_on_level & LOG_NOTICE)
  248.                             beep_em(1);
  249.                         set_lastlog_msg_level(level);
  250.                         if (not_from_server)
  251.                             notify_mark(from, 1, 0);
  252.                     }
  253.                 }
  254.             }
  255.         }
  256.         else 
  257.             parse_server_notice(from, line);
  258.     }
  259.     else
  260.         put_it("%s", line + 1);
  261. }
  262.  
  263. /*
  264.  * got_initial_version: this is called when ircii get the NOTICE in
  265.  * all version of ircd before 2.8, or the 002 numeric for 2.8 and
  266.  * beyond.  I guess its handled rather badly at the moment....
  267.  * added by phone, late 1992.
  268.  */
  269. void    got_initial_version(line)
  270. char    *line;
  271. {
  272.     char    server[81],
  273.         version[21];
  274.     char    *c;
  275.  
  276.     /*
  277.      * BROKEN_SCANF crap here provided by Aiken <adrum@u.washington.edu>
  278.      * sometime 1993...
  279.      */
  280.  
  281. #ifdef BROKEN_SCANF
  282.     if (strncmp(line, "*** Your host is ", 17))
  283.         return;
  284.     strncpy(server, &line[17], 80);
  285.  
  286.     server[79] = 0;
  287.     if(c = index(server, ','))
  288.         *c = 0;
  289.     if(c = index(server, ' '))
  290.         *c = 0;
  291.     version[0] = 0;
  292.  
  293.     if(c = index(&line[17], ' ')) 
  294.     {
  295.         if(!strncmp(c, " running version ", 17))
  296.         {
  297.             strncpy(version, &c[17], 20);
  298.             version[19] = 0;
  299.         }
  300.                 else return;
  301.     }
  302.     else return;
  303. #else
  304.     if ((sscanf(line, "*** Your host is %80s running version %20s",
  305.             server, version)) != 2)
  306.         return;
  307. #endif /* BROKEN_SCANF */
  308.     attempting_to_connect--;
  309.     set_server_motd(from_server, 1);
  310.     server_is_connected(from_server, 1);
  311. #ifndef BROKEN_SCANF
  312.     server[strlen(server) - 1] = '\0';
  313. #endif /* BROKEN_SCANF */
  314.     if ((c = (char *) index(server, '[')) != NULL)
  315.         *c = '\0';    /*
  316.                  * Handles the case where the server name is
  317.                  * different to the host name.
  318.                  */
  319.     if (!strncmp(version, "2.5", 3))
  320.         set_server_version(from_server, Server2_5);
  321.     else if (!strncmp(version, "2.6", 3))
  322.         set_server_version(from_server, Server2_6);
  323.     else if (!strncmp(version, "2.7", 3))
  324.         set_server_version(from_server, Server2_7);
  325.     else
  326.         set_server_version(from_server, Server2_8);
  327.     malloc_strcpy(&server_list[from_server].version_string, version);
  328.     set_server_itsname(from_server, server);
  329.     reconnect_all_channels();
  330.     reinstate_user_modes();
  331.     if (never_connected)
  332.     {
  333.         never_connected = 0;
  334.         loading_global = 1;
  335.         load(empty_string, "global");
  336.         loading_global = 0;
  337.         /* read the .ircrc file */
  338.         if (access(ircrc_file, R_OK) == 0){
  339.             define_big_buffer(buffer);
  340.  
  341.             strmcpy(buffer,ircrc_file,BIG_BUFFER_SIZE);
  342.             strmcat(buffer," ",BIG_BUFFER_SIZE);
  343.             strmcat(buffer,args_str,BIG_BUFFER_SIZE);
  344.             load(empty_string, buffer);
  345.  
  346.             free_big_buffer(buffer);
  347.         }
  348.         else if (get_int_var(NOVICE_VAR))
  349.             say("If you have not already done so, please read the new user information with /HELP NEWUSER");
  350.     }
  351.     else if (server_list[from_server].away)
  352.         send_to_server("AWAY :%s", server_list[from_server].away);
  353.     update_all_status();
  354.     do_hook(CONNECT_LIST, "%s %d", get_server_name(from_server),
  355.         get_server_port(from_server));
  356. }
  357.